package flp.solvers.genetic;

import flp.solvers.*;

/**
 * Klasa zawiera ustawienia dla algorytmu genetycznego.
 * 
 * @author Necro
 */
public class GeneticSettings implements ISettings
{
    /** Ilosc osobnikow w populacji. */
    private int populationCount;
    /** Rozmiar pojedynczego layoutu. */
    private int layoutSize;
    /** Wartosc dla warunku stopu. */
    private int epsilon;
    /** Maksymalna ilosc iteracji. */
    private int maxIterations;
    /** Typ optymalizacji, 0 - podstawowy lub 1 - rozszerzony. */
    private int type;
    /** 
     * Ilosc iteracji spelniajacych warunek stopu
     * po ktorej zatrzymany zostaje proces ewolucji.
     */
    private int stopIterations;
    /**
     * Zmienna sterujaca prawdopodobienstwem wystapienia mutacji.
     */
    private int mutationProbability;
    /**
     * Liczba dolosowan w rozszerzonym algorytmie.
     */
    private int redrawCount;
    /**
     * Ilosc dozwolonych pokolen w przypadku przeprowadzania optymalizacji metoda pokolen.
     */
    private int generations = 50;

    /**
     * Konstruktor klasy Settings.
     * 
     * @param populationCount Ilosc osobników w populacji.
     * @param epsilon Wartosc dla warunku stopu.
     * @param maxIterations Maksymalna ilosc iteracji algorytmu.
     * @param layoutSize Rozmiar pojedynczego Layoutu.
     * @param stopIterations Ilosc iteracji dla stopu.
     */
    public GeneticSettings(int populationCount, int layoutSize, int epsilon,
            int maxIterations, int stopIterations, int mutationProbability,
            int algorithmType, int redrawCount)
    {
        this.populationCount = populationCount;
        this.layoutSize = layoutSize;
        this.epsilon = epsilon;
        this.maxIterations = maxIterations;
        this.stopIterations = stopIterations;
        this.mutationProbability = mutationProbability;
        this.setType(algorithmType);
        this.redrawCount = redrawCount;
    }

    @Override
    public String toString()
    {
        String result = "Population Count: " + this.populationCount +
                "\nLayoutSize: " + this.layoutSize +
                "\nEpsilon: " + this.epsilon +
                "\nMax of Iterations: " + this.maxIterations +
                "\nStop Iterations: " + this.stopIterations;
        return result;
    }

    public int getMutationProbability()
    {
        return mutationProbability;
    }

    public int getEpsilon()
    {
        return epsilon;
    }

    public void setEpsilon(int epsilon)
    {
        this.epsilon = epsilon;
    }

    public int getMaxIterations()
    {
        return maxIterations;
    }

    public void setMaxIterations(int maxIterations)
    {
        this.maxIterations = maxIterations;
    }

    public int getPopulationCount()
    {
        return populationCount;
    }

    public void setPopulationCount(int populationCount)
    {
        this.populationCount = populationCount;
    }

    public int getLayoutSize()
    {
        return layoutSize;
    }

    public void setLayoutSize(int layoutSize)
    {
        this.layoutSize = layoutSize;
    }

    public int getStopIterations()
    {
        return stopIterations;
    }

    public void setStopIterations(int stopIterations)
    {
        this.stopIterations = stopIterations;
    }

    public int getGenerations()
    {
        return generations;
    }

    public void setGenerations(int generations)
    {
        this.generations = generations;
    }

    void setType(int type)
    {
        this.type = (1 == type) 
                ? 1 
                : 0;
    }

    public int getType()
    {
        return type;
    }
    
    public int getRedrawCount()
    {
        return redrawCount;
    }
}
